var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var utils=require('./utils/index')
  
var indexRouter = require('./routes/index');



var bannerApi=require('./api/banner')
var navApi=require('./api/nav')
var uploadProduct=require('./api/pro')
var usersRouter=require('./api/users')
var adminRouter=require('./api/admin')
var cartApi = require('./api/cart')
var address=require('./api/address')
var orderApi = require('./api/order')

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


app.all('*', function (req, res, next) {

  res.header('Access-Control-Allow-Origin', '*');
  
  //Access-Control-Allow-Headers ,可根据浏览器的F12查看,把对应的粘贴在这里就行
  
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  
  res.header('Access-Control-Allow-Methods', '*');
  
  res.header('Content-Type', 'application/json;charset=utf-8');
  
  next();
  
});
//将以api为开头的所有接口设置验证
// app.all('/api/*', (req, res, next) => {
//   if (req.url !== '/api/admin/login') {
//     const token = req.headers.token || req.query.token || req.body.token

//     if (token) {
//       utils.validateToken(token, '就nm离谱')
//         .then((decoded) => {

//           next()
//         })
//         .catch(() => {
//           res.status(200).send({
//             code: '10119',
//             message: '无效的token'
//           })
//         })
//     } else {
//       res.status(200).send({
//         code: '10119',
//         message: '无效的token'
//       })
//     }
//   } else {
//     next()
//   }
// })
app.all('/api/cart/*', (req, res, next) => {
  const token = req.headers.token || req.query.token || req.body.token
  // console.log('token', token)
  if (token) {
    utils.validateToken(token, '就nm离谱')
      .then((decoded) => {
        // req.decoded = decoded
        next()
      })
      .catch(() => {
        res.status(200).send({
          code: '10119',
          message: '无效的token'
        })
      })
  } else {
    res.status(200).send({
      code: '10119',
      message: '无效的token'
    })
  } 
  
})
app.all('/api/address/*', (req, res, next) => {

  const token = req.headers.token || req.query.token || req.body.token
  console.log('token', token)
  if (token) {
    utils.validateToken(token, '就nm离谱')
      .then((decoded) => {
        // req.decoded = decoded
        next()
      })
      .catch(() => {
        res.status(200).send({
          code: '10119',
          message: '无效的token'
        })
      })
  } else {
    res.status(200).send({
      code: '10119',
      message: '无效的token'
    })
  } 
  
})
app.all('/api/order/*', (req, res, next) => {

  const token = req.headers.token || req.query.token || req.body.token
  console.log('token', token)
  if (token) {
    utils.validateToken(token, '就nm离谱')
      .then((decoded) => {
        // req.decoded = decoded
        next()
      })
      .catch(() => {
        res.status(200).send({
          code: '10119',
          message: '无效的token'
        })
      })
  } else {
    res.status(200).send({
      code: '10119',
      message: '无效的token'
    })
  } 
  
})

app.use('/api/banner',bannerApi)
app.use('/api/nav',navApi)
app.use('/api/pro',uploadProduct)
app.use('/api/users', usersRouter);
app.use('/api/admin',adminRouter)
app.use('/api/cart',cartApi)
app.use('/api/address',address)
app.use('/api/order', orderApi)

app.use('/', indexRouter);


// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
